Best practices - writing .proto files
Writing proto files - best practices
- Use PascalCase (with an initial capital) for message names – for example,
SongServerRequest - Use lower_snake_case for field names (including oneof field and extension names) – for example, song_name.
message SongServerRequest {
optional string song_name = 1;
}
- If your field name contains a number, the number should appear after the letter instead of after the underscore. For example, use
song_name1instead ofsong_name_1 - Use pluralized names for repeated fields.
repeated string keys = 1;
...
repeated MyMessage accounts = 17;
- Use PascalCase (with an initial capital) for enum type names and CAPITALS_WITH_UNDERSCORES for value names:
enum FooBar {
FOO_BAR_UNSPECIFIED = 0;
FOO_BAR_FIRST_VALUE = 1;
FOO_BAR_SECOND_VALUE = 2;
}
- Each enum value should end with a semicolon, not a comma
- Prefer prefixing enum values instead of surrounding them in an enclosing message
- The zero value enum should have the suffix
UNSPECIFIED, because a server or application that gets an unexpected enum value will mark the field as unset in the proto instance - If your .proto defines an RPC service, you should use PascalCase (with an initial capital) for both the service name and any RPC method names:
Syntax
- first line of the file must be the syntax version.
syntax = "proto3";otherwise the compiler will asumeproto2 - field types can be scalar types, enumerations and composed of other message types
Message Fileds cand be :
singular types
optional
repeated
map
The order of the fields has no implication, the only thing that matters is the numbering
Working with messages
Large data sets
As a general rule of thumb, if you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.
That said, Protocol Buffers are great for handling individual messages within a large data set. . Usually, large data sets are a collection of small pieces, where each small piece is structured data. Even though Protocol Buffers cannot handle the entire set at once, using Protocol Buffers to encode each piece greatly simplifies your problem: now all you need is to handle a set of byte strings rather than a set of structures.
Self describing messages
Protocol Buffers do not contain descriptions of their own types. Thus, given only a raw message without the corresponding .proto file defining its type, it is difficult to extract any useful data
File locations
Prefer not to put .proto files in the same directory as other language sources. Consider creating a subpackage proto for .proto files, under the root package for your project